package com.gradumate.client.gui;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.RootPanel;
import com.gradumate.client.Element;
import com.gradumate.client.GraduMate;
import com.gradumate.client.service.GraduMateService;
import com.gradumate.client.service.GraduMateServiceAsync;
import com.gradumate.shared.Gebruiker;

/**
 * 
 * @author HugoZonderland
 * 
 *         Deze pagina stelt de leden van de afstudeercommissie in staat het
 *         oordeel over een afstudeervoorstel te geven. Op de pagina staat een
 *         lijst met alle nog te beoordelen afstudeervoorstellen. Deze worden
 *         vanaf de Alfresco server opgehaald. Via een icoontje kan worden
 *         doorgeklikt naar een detailpagina waar het oordeel kan worden
 *         ingevuld.
 * 
 * @see com.gradumate.client.gui.AfstudeercommissieAfstudeerVoorstelDetail;
 * 
 */
public class AfstudeercommissieAfstudeerVoorstelLijst {

	// Asyncserver
	private GraduMateServiceAsync server = GWT.create(GraduMateService.class);

	// Logger
	private final Logger log = Logger.getLogger(AfstudeercommissieAfstudeerVoorstelLijst.class.getName());

	// Element
	private Element element = new Element();

	// Table
	private FlexTable table;
	private int row;

	/**
	 * Constructor
	 */
	public AfstudeercommissieAfstudeerVoorstelLijst() {
		// Loading-gif plaatsen.
		GraduMate.setLoadingImage(true);
		GraduMate.clearStatusMessages();
		
		// Afstudeervoorstellen ophalen
		server.getAfstudeerVoorstelOverzicht(new AsyncCallback<ArrayList<Gebruiker>>() {

			public void onFailure(Throwable caught) {
				log.info("Service failure -> getAfstudeerVoorstelOverzicht() -> " + caught.getMessage());
				GraduMate.addAsyncError();
			}

			@Override
			public void onSuccess(ArrayList<Gebruiker> studenten) {
				createForm(studenten);
			}
		});
	}

	/**
	 * Maakt het formulier aan
	 * 
	 * @param result
	 */
	private void createForm(ArrayList<Gebruiker> studenten) {
		// Flextable opnieuw aanmaken
		FlexTable hTable = new FlexTable();
		hTable.setStyleName("datatableNoBorder");

		// Header op het panel plaatsen.
		hTable.setWidget(0, 0, element.getHeaderLabel("Overzichtslijst afstudeervoorstellen"));

		// Table aanmaken
		table = new FlexTable();
		table.setStyleName("datatable");
		table.setCellSpacing(0);
		table.setCellPadding(0);
		row = 0;

		// Header van de tabel aanmaken
		table.setWidget(row, 0, element.getDataTableHeaderLabel("Student"));
		table.setWidget(row, 1, element.getDataTableHeaderLabel("Opties"));
		row++;

		// Controleren of er wel sites zijn.
		if (studenten != null && !studenten.isEmpty()) {
			// Door de sites heenlopen en ze aan de tabel toevoegen
			for (final Gebruiker student : studenten) {

				table.setWidget(row, 0, element.getLabel(student.getVoornaam() + " " + student.getAchternaam()));
				Image imgRow = element.getImage("Ga naar", "folder_go.png");

				// Clickable image moet doorverwijzen naar een detail pagina
				imgRow.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent e) {
						new AfstudeercommissieAfstudeerVoorstelDetail(student, null);
					}
				});
				// Toevoegen aan de table
				table.setWidget(row, 1, imgRow);
				row++;
			}

		} else {
			// Bericht op het scherm droppen
			GraduMate.addInformationMsg("Er zijn geen afstudeervoorstellen om te beoordelen.");
		}

		// Laadimage uit
		GraduMate.setLoadingImage(false);
		// Rootpanel schoonvegen en tabellen erop zetten
		RootPanel.get("main").clear();
		RootPanel.get("main").add(hTable);
		RootPanel.get("main").add(table);
	}
}
